home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (PO) / Nibble Volume 10, No. 05 (1989-05)(MicroSPARC)(Side A)[a].zip / Nibble Volume 10, No. 05 (1989-05)(MicroSPARC)(Side A)[a].po / TEXT.DECRUNCH.S < prev    next >
Text File  |  1996-12-24  |  4KB  |  197 lines

  1. ********************************
  2. *   TEXT.DECRUNCH Source Code  *
  3. *      by Howard Huang         *
  4. *      Copyright (c) 1985      *
  5. *      by MicroSPARC, Inc.     *
  6. *      Concord, MA 01742       *
  7. *                              *
  8. *      Assembler: MERLIN       *
  9. ********************************
  10.  
  11.           ORG $60B9      ;Place in memory after CRUNCH
  12.  
  13. *
  14. * --> Equates
  15. *
  16.  
  17. TEMP      = $2           ;Temporary storage
  18. COUNTER   = $3           ;Count characters in group
  19. ALLFLAG   = $4           ;Decrunch lowercase?
  20. CODE      = $6           ;Pointer to encoded text
  21. TEXT      = $8           ;Pointer to normal text
  22. LEFT      = $A           ;Shift left counter
  23. RIGHT     = $B           ;Shift right counter
  24.  
  25. *==============
  26. * PROGRAM START
  27. *==============
  28.  
  29. *
  30. * --> Initialize
  31. *
  32.  
  33. DECRUNCH  LDY #0
  34.           LDA ALLFLAG
  35.           BNE ALLCHARS   ;Decrunch upper AND lower case
  36.  
  37. *===================
  38. * DECRUNCH UPPERCASE
  39. *===================
  40.  
  41. BEGIN     LDA #0
  42.           STA COUNTER    ;Init counter
  43.  
  44. UPPERC    LDA (CODE),Y   ;Get encoded char
  45.           LDX COUNTER
  46.           AND MASK1,X    ;Get rid of some bits
  47.           PHA
  48.           LDA LEFTTAB1,X
  49.           STA LEFT       ;Times to shift left
  50.           PLA
  51.           JSR MOVELEFT   ;Move leftward
  52.  
  53.           LDX COUNTER
  54.           CPX #0
  55.           BEQ NEXT
  56.           CPX #3
  57.           BEQ NEXT       ;Don't load new byte
  58.  
  59.           JSR INCCODE
  60.  
  61. NEXT      LDA (CODE),Y
  62.           AND MASK2,X    ;Strip off bits
  63.           PHA
  64.           LDA RGHTTAB1,X ;Times to shift right
  65.           STA RIGHT
  66.           PLA
  67.           JSR MOVERGHT   ;Move right
  68.  
  69.           ORA TEMP
  70.           BEQ END        ;No more
  71.           STA TEMP
  72.           AND #$20
  73.           CMP #$20       ;Check if bit 5 is on
  74.           BEQ MASK80     ;If on, use $80 as mask
  75.  
  76.           LDA #$C0       ;Use $C0 mask
  77.           HEX 2C
  78. MASK80    LDA #$80
  79.           ORA TEMP       ;Tack onto byte
  80.           STA (TEXT),Y
  81.           INC TEXT       ;Next storage space
  82.           BNE CONTINUE
  83.           INC TEXT+1
  84.  
  85. CONTINUE  INC COUNTER
  86.           LDA COUNTER
  87.           CMP #4         ;Done with group?
  88.           BNE UPPERC     ;Not yet
  89.           JSR INCCODE    ;Start at next group
  90.           JMP BEGIN      ;Do another group
  91.  
  92. END       STA (TEXT),Y   ;Zero last byte
  93.           RTS
  94.  
  95. *
  96. * --> Table of masks and shifts
  97. *
  98.  
  99. MASK1     DFB $00,$03,$0F,$3F
  100. MASK2     DFB $FF,$FF,$C0,$00
  101. LEFTTAB1  DFB $00,$04,$02,$00
  102. RGHTTAB1  DFB $02,$04,$06,$00
  103.  
  104.  
  105. *==============================
  106. * DECRUNCH UPPER AND LOWER CASE
  107. *==============================
  108.  
  109. ALLCHARS  LDA #1
  110.           STA COUNTER    ;Init COUNTER
  111.  
  112. LOWERC    LDA (CODE),Y   ;Get byte of code
  113.           LDX COUNTER
  114.           CPX #1
  115.           BEQ NOAND      ;Nothing to AND
  116.           AND MASK-1,X   ;Erase unwanted bits
  117.           CPX #8
  118.           BEQ ONEBYTE    ;No combining to do
  119.  
  120.           PHA
  121.           LDA LEFTTAB-1,X
  122.           STA LEFT       ;Shift left
  123.           PLA
  124.           JSR MOVELEFT
  125.  
  126.           JSR INCCODE
  127.  
  128. NOAND     LDX COUNTER
  129.           STX RIGHT      ;Shift right how much
  130.           JSR MOVERGHT
  131.           LDX COUNTER
  132.           CPX #1
  133.           BEQ ONEBYTE    ;No combining
  134.  
  135.           ORA TEMP
  136.  
  137. ONEBYTE   CMP #0         ;Check for end
  138.           BEQ END        ;Quit
  139.           ORA #$80       ;Add high bit
  140.           STA (TEXT),Y   ;Save in buffer
  141.           INC TEXT
  142.           BNE NEXTCHAR
  143.           INC TEXT+1
  144.  
  145. NEXTCHAR  INC COUNTER    ;Next in group
  146.           LDA COUNTER
  147.           CMP #9
  148.           BNE LOWERC     ;Still same group
  149.           JSR INCCODE    ;First char of next group
  150.           JMP ALLCHARS   ;Start another group
  151.  
  152. *
  153. * --> Table of masks and shifts
  154. *
  155.  
  156. MASK      DFB $00,$01,$03,$07,$0F,$1F,$3F,$7F
  157. LEFTTAB   DFB $00,$06,$05,$04,$03,$02,$01,$00
  158.  
  159.  
  160. *============
  161. * SUBROUTINES
  162. *============
  163.  
  164. *
  165. * --> Increment pointer to encoded text
  166. *
  167.  
  168. INCCODE   INC CODE       ;Next
  169.           BNE INCCODE1
  170.           INC CODE+1     ;Next page
  171. INCCODE1  LDA (CODE),Y   ;Get byte
  172.           RTS
  173.  
  174. *
  175. * --> Shift byte leftwards
  176. *
  177.  
  178. MOVELEFT  LDX LEFT
  179. LEFT:1    BEQ ENDLEFT
  180.           ASL
  181.           DEX
  182.           JMP LEFT:1     ;Shift again
  183. ENDLEFT   STA TEMP       ;Save resulting byte
  184.           RTS
  185.  
  186. *
  187. * --> Shift byte right
  188. *
  189.  
  190. MOVERGHT  LDX RIGHT
  191. RGHT:1    BEQ ENDRIGHT   ;No more
  192.           LSR
  193.           DEX
  194.           JMP RGHT:1
  195. ENDRIGHT  RTS
  196.           LST OFF
  197.